CNC 示例 17:从字符串中读取 G 代码
参见 CNC17_ReadGCodeFromStrings.project CODESYS 安装目录下的示例项目 ..\CODESYS SoftMotion\Examples。
该示例项目展示了如何使用 smc_stringStream2 从字符串中读取 G 代码。
这个例子可以看作是一个起点,用于从其他来源读取 G 代码,例如通过网络通信(套接字)。在这种情况下,需要实现一个功能块来实现 SMC_ITextStream 接口并读取文本(例如,从套接字读取)。这与方法类似 SMC_StringStream2 实现此接口以从字符串中读取 G 代码。
应用程序的结构
该结构是数控应用的典型结构。G 代码在后台任务中读取PathTask),路径预处理也在这里进行。插值是在总线任务中执行的
在 Path 程序, SMC_ReadNCFromStream 功能块用于读取 G 代码。出于技术原因,不仅仅是类型的直播 SMC_StringStream2 被传递给这个函数块,但也传递给一个大小取决于参数的数组 SMC_CNC_LibParams.MAX_SUBPROGRAM_NESTING_DEPTH。数组中的第一个流用于主程序,而其他流用于可能的子程序调用
一开始,主程序被加载到数组的第一个流中:
// Load G-Code into first stream aStringStream[0].Init(sProgramName) ; aStringStream[0].AppendData(sGCode) ; aStringStream[0].SetEndOfData() ;
然后,一切准备就绪,可以读取常用的 G 代码程序。该示例还显示了如何支持子程序调用。
为此,必须创建一个函数块来实现 SMC_INCLookup 接口。此功能块负责在读取子程序时返回子程序的 G 代码 SMC_ReadNCFromStream。这个 Lookup 方法接收子程序的名称并使用 G 代码初始化传入流:
METHOD LookUp : SMC_ERROR VAR_IN_OUT CONSTANT programName : STRING; END_VAR VAR_INPUT stream : SMC_ITextStream; END_VAR VAR i : UDINT ; pStringStream : POINTER TO SMC_StringStream2 ; END_VAR
此示例搜索子程序数组。该数组定义在 Path 编程为 VAR_INPUT:
// The table of subprograms.
aSubs : ARRAY[0..0] OF SubProgram := [
(stName := 'SUB1',
stContent := '
SUBPROGRAM SUB1{#p1 : LREAL, #p2 : LREAL, #p3 : LREAL}
N10 G1 X#p1
N20 G1 X#p2
N30 G1 X#p3
END_SUBPROGRAM')
] ;在 Lookup,对数组进行迭代,直到找到名称匹配的子程序:
i := 0 ;
WHILE i < nNumSPs DO
IF psp[i].stName = programName THEN
IF NOT __QUERYPOINTER(stream, pStringStream) OR_ELSE
pStringStream = 0
THEN
// A stream of the wrong type has been passed by SMC_ReadNCFromStream.
LookUp := SMC_CNC_INTERNAL_ERROR ;
ELSE
pStringStream^.Init(sName := psp[i].stName) ;
LookUp := pStringStream^.AppendData(psp[i].stContent) ;
pStringStream^.SetEndOfData() ;
END_IF
RETURN ;
END_IF
i := i + 1 ;
END_WHILE
// No subprogram with name programName has been found in the array psp.
LookUp := SMC_RNCF_SUBPROGRAM_FILE_NOT_FOUND ;调试
生成应用程序并将其下载到控制器。
打开可视化。
按 开始 开始 G 代码处理。